<?php

class Pagination {

    private $php_self;
    private $rows_per_page = 10;
    //Number of records to display per page
    public $total_resultados = 0;
    //Total number of rows returned by the query
    public $total_resultados_html;
    //Código html que mostra os resultados da pesquisa
    private $links_per_page = 5;
    //Number of links to display per page //numero impar � aconselhado
    public $append = "";
    //Paremeters to append to pagination links
    public $append_second_page = "";
    //Paremeters to append to pagination links
    private $page = 1;
    private $max_pages = 0;
    private $offset = 0;
    private $db = "";
    private $sql = "";
    public $pesquisas;
    public $ordenacoes;
    public $ordenacao;
    private $search;
    public $search_original;
    public $direcao;
    public $link;
    public $query_ordenacao;
    private $direcoes = array("asc", "desc");
    public $imagens;
    // imagens dos que n�o est�o ordenados
    public $imagem;
    //imagem do que est� ordenado
    public $keywordsPesquisa;

    function Pagination($db, $sql, $append, $pesquisas, $ordenacoes, $coluna_a_ordenar_por_defeito, $ordem_a_ordenar_por_defeito) {
        $this->ordenacao = $coluna_a_ordenar_por_defeito;
        $this->direcao = $ordem_a_ordenar_por_defeito;

        $this->pesquisas = $pesquisas;
        $this->ordenacoes = $ordenacoes;


        $this->db = $db;
        $this->sql = $sql;

        $this->append = $append;
        //para o search das segunda paginas
        $this->append_second_page = substr($this->append, 5);
        //echo $this->append_second_page,'<br />';

        $this->php_self = htmlspecialchars($_SERVER['PHP_SELF']);
        if (isset($_GET['page'])) {
            $this->page = intval($_GET['page']);
        }
    }

    private function calculaNumeroTotalDeResultados() {
        $sql = stristr($this->sql, 'FROM');
        $sql = "select count(*) as total " . $sql;
        $this->total_resultados = $this->db->getall($sql);
        $this->total_resultados = $this->total_resultados[0]->total;
        //printArray($this->total_resultados);
    }

    public function altera_cor($cor) {
        echo '
			<style type="text/css">
		  	.page_link {
			background: none repeat scroll 0 0 #FFFFFF;
			color:' . $cor . ';
			text-decoration: none;
			border: 1px solid ' . $cor . ';
			font-size: 10px;
			padding: 1px 4px;
			}
			.page_link:hover {
				color:white;
				border: 1px solid ' . $cor . ';
				background-color: ' . $cor . ';
			}
			.current_page_link {
			background: none repeat scroll 0 0 ' . $cor . ';
			text-decoration: none;
			color:#FFFFFF;
			font-weight: bold;
			}

		  	</style>
			';
    }

    public function paginate() {
        global $db, $smarty;
        $this->altera_cor('silver');

        //Search
        $this->search = isset($_POST['search']) ? $_POST['search'] : "";
        $this->search_original = $this->search;

        if (strlen(trim($this->search)) != 0) {
            $this->search = "%" . $this->search . "%";
            $this->search = $db->qstr($this->search);

            $procuras = implode(" like $this->search or ", $this->pesquisas);
            $this->sql = $this->sql . "and ($procuras  like $this->search)";

            $this->keywordsPesquisa = mysql_real_escape_string(trim($this->search_original));
            $smarty->assign("keywordsPesquisa", $this->keywordsPesquisa);
        }

        //echo $this->sql;
        //Coluna a ordenar e direcao


        if (isset($_POST['direcao'])
                && in_array($_POST['direcao'], $this->direcoes)
                && isset($_POST['ordenacao'])
                && in_array($_POST['ordenacao'], $this->ordenacoes)) {

            $this->direcao = $_POST['direcao'];
            $this->ordenacao = $_POST['ordenacao'];
        }

        $this->sql = $this->sql . " order by " . $this->ordenacao . " " . $this->direcao;
        //echo $this->sql;die;
        $smarty->assign("mostra_procura", "sim");

        $this->calculaNumeroTotalDeResultados();
        $tamanho = count($this->ordenacoes);
        for ($i = 0; $i < $tamanho; $i++) {
            //caso seja a coluna seleccionado para ordenacao
            if ($this->ordenacoes[$i] == $this->ordenacao) {
                //$this->link[$i] = $_SERVER["PHP_SELF"].'?menu='.$_POST['menu'].
                $this->link[$i] = $_SERVER["PHP_SELF"] . "?$this->append" .
                        /* '&search='.$this->search_original. */
                        '&search=' . $this->search_original .
                        '&ordenacao=' . $this->ordenacao .
                        '&direcao=' . $this->troca_direcao($this->direcao);


                if ($this->direcao == 'desc') {
                    $this->imagem[$i] = '<img src="/etc/images/desc.png"/>';
                }
                if ($this->direcao == 'asc') {
                    $this->imagem[$i] = '<img src="/etc/images/asc.png"/>';
                }
            } else {
                //fica com ambas as imagens
                $this->link[$i] = $_SERVER["PHP_SELF"] . "?$this->append" .
                        '&search=' . $this->search .
                        '&ordenacao=' . $this->ordenacoes[$i] .
                        '&direcao=' . $this->direcoes[0];
                $this->imagem[$i] = '<img src="/etc/img/ascdesc.png"/>&nbsp;&nbsp;';
            }
        }
        $this->imprime_numero_de_resultados_da_pesquisa();
        //mantem a ordena��o durante a mudan�a de p�gina
        $this->append = $this->append . '&search=' . $this->search_original . '&ordenacao=' . $this->ordenacao . '&direcao=' . $this->troca_direcao($this->direcao) . '&ordenacao=' . $this->ordenacao;
        //echo $this->append;

        $this->max_pages = ceil($this->total_resultados / $this->rows_per_page);
        if ($this->links_per_page > $this->max_pages) {
            $this->links_per_page = $this->max_pages;
        }
        if ($this->page > $this->max_pages || $this->page <= 0) {
            $this->page = 1;
        }
        $this->offset = $this->rows_per_page * ($this->page - 1);
        return $this->db->getall($this->sql . " LIMIT {$this->offset}, {$this->rows_per_page}" . ';');
    }

    public function imprime_numero_de_resultados_da_pesquisa() {

        if ($this->total_resultados == 0) {
            $this->total_resultados_html = '<div style="text-align:right;font-family:sans-serif; font-size: 1.1em; font-style:normal; font-variant: normal;font-weight: lighter;">' . $this->total_resultados . ' resultados encontrados</div>';
            return FALSE;
        } else {
            if ($this->total_resultados == 1) {
                $this->total_resultados_html = '<div style="text-align:right;font-family:sans-serif; font-size: 1.1em; font-style:normal; font-variant: normal;font-weight: lighter;">' . $this->total_resultados . ' resultado encontrado</div>';
            } else {
                $this->total_resultados_html = '<div style="text-align:right;font-family:sans-serif; font-size: 1.1em; font-style:normal; font-variant: normal;font-weight: lighter;">' . $this->total_resultados . ' resultados encontrados</div>';
            }
        }
        return $this->total_resultados_html;
    }

    private function troca_direcao() {
        if ($this->direcao == 'desc') {
            $this->direcao = 'asc';
        } else {
            $this->direcao = 'desc';
        }
        return $this->direcao;
    }

    //$tag = '&gt;&gt;'
    //'&gt;'
    private function renderNext($tag = '&gt;') {
        if ($this->total_resultados == 0)
            return FALSE;

        $paginaDestinoSalto = min($this->page + $this->links_per_page, $this->max_pages);

        if ($paginaDestinoSalto < $this->max_pages) {
            return '<a class="page_link" href="' . $this->php_self . '?page=' . ($paginaDestinoSalto) . '&' . $this->append . '">' . $tag . '</a>';
        } else {
            return '<span class="page_link">' . "$tag " . '</span>';
        }
    }

    //$tag = '&lt;&lt;'
    //'&lt;'
    private function renderPrev($tag = '&lt;') {
        if ($this->total_resultados == 0)
            return FALSE;
        $paginaDestinoSalto = max($this->page - $this->links_per_page, 1);
        if ($paginaDestinoSalto > 1) {
            return ' <a class="page_link" href="' . $this->php_self . '?page=' . ($paginaDestinoSalto) . '&' . $this->append . '">' . $tag . '</a>';
        } else {
            return '<span class="page_link">' . "$tag " . '</span>';
        }
    }

    //private function renderNav($prefix = '<span class="page_link">', $suffix = '</span>') {
    private function renderNav($prefix = '', $suffix = '') {
        if ($this->total_resultados == 0)
            return FALSE;

        $start = $this->page - floor($this->links_per_page / 2);
        $start = max(1, $start);
        $start = min($this->max_pages - $this->links_per_page, $start);

        $end = $start + $this->links_per_page;
        $end = min($this->max_pages, $end);

        if ($end > $this->links_per_page) {
            $start = $end - $this->links_per_page;
        }

        if ($end == $this->page) {
            $start = $end - $this->links_per_page + 1;
        }
        $links = '';

        if ($start != 1 && $start != $this->max_pages) {
            $links .= $prefix . '<a class="page_link" href="' . $this->php_self . '?page=' . '1' . '&' . $this->append . '">' . '1' . '</a>' . $suffix . ' ... ';
        }

        for ($i = $start; $i < $end; $i++) {

            if ($i == $this->page) {
                $links .=$prefix . "<a class='page_link current_page_link'>" . $i . "</a>";
            } else {
                $links .= ' ' . $prefix . '<a class="page_link" href="' . $this->php_self . '?page=' . $i . '&' . $this->append . '">' . $i . '</a>' . $suffix . ' ';
            }
        }

        if ($end == $this->max_pages && $this->max_pages == $this->page) {
            $links .= $prefix . '<a class="page_link current_page_link" href="' . $this->php_self . '?page=' . $this->max_pages . '&' . $this->append . '">' . $this->max_pages . '</a>' . $suffix;
        } else {
            $links .= $prefix . '... <a class="page_link" href="' . $this->php_self . '?page=' . $this->max_pages . '&' . $this->append . '">' . $this->max_pages . '</a>' . $suffix;
        }



        /*
          if($end != $this->max_pages)
          {
          $links .= $prefix . '... <a class="page_link" href="' . $this->php_self . '?page=' . $this->max_pages . '&' . $this->append . '">' . $this->max_pages . '</a>' . $suffix ;
          } */
        return $links;
    }

    public function renderFullNav() {
        //return  '<div class="fullnav" style="text-align:center;text-decoration: none;">'.$this->renderFirst() . '&nbsp;' . $this->renderPrev() . '&nbsp;' . $this->renderNav() . '&nbsp;' . $this->renderNext() . '&nbsp;' . $this->renderLast().'</div>';
        return '<div class="fullnav" style="text-align:center;text-decoration: none;">&nbsp;' . $this->renderPrev() . '&nbsp;' . $this->renderNav() . '&nbsp;' . $this->renderNext() . '</div>';
    }

    function fillAppendFromRequestKeys($keys) {

        foreach ($keys AS $key) {
            if (isset($_POST[$key])) {
                $this->append .= "$key={$_POST[$key]}&";
            } else {
                $this->append .= "$key&";
            }
        }
    }

    public function getRowsPerPage() {
        return $this->rows_per_page;
    }

    public function setRowsPerPage($x) {
        if (is_numeric($x) and $x > 0) {
            $this->rows_per_page = $x;
        }
    }

}